#include "imgui.h" // ImGui主头文件，提供UI控件API
#include "imgui_impl_glfw.h" // ImGui与GLFW平台的对接实现
#include "imgui_impl_opengl3.h" // ImGui与OpenGL3渲染的对接实现
#include <GLFW/glfw3.h> // GLFW库，负责窗口和输入管理
#include <iostream> // 标准输入输出流库

// 简化的参数窗口类
class SimpleParamWindow
{
private:
    bool visible = true; // 控制窗口是否显示

public:
    // 参数变量
    float speed = 1.0f; // 移动速度参数
    int quality = 5; // 渲染质量参数
    bool vsync = true; // 垂直同步开关
    float color[3] = {0.8f, 0.3f, 0.2f}; // 物体颜色参数（RGB）

    // 渲染参数窗口
    void Render()
    {
        if (!visible) return; // 如果窗口不可见则直接返回

        // 获取主视口尺寸并设置窗口为全屏
        ImGuiViewport* viewport = ImGui::GetMainViewport();
        ImGui::SetNextWindowPos(viewport->Pos); // 设置窗口左上角位置
        ImGui::SetNextWindowSize(viewport->Size); // 设置窗口大小为视口大小
        ImGui::Begin("参数调节面板", &visible); // 创建可拖动、可缩放、可关闭的动态窗口

        // 移动速度参数
        ImGui::Text("移动速度:"); // 显示标签
        ImGui::SliderFloat("##speed", &speed, 0.1f, 10.0f, "%.2f"); // 滑动条调节速度
        ImGui::SameLine(0.0f, -1.0f); // 在同一行显示，使用默认参数
        ImGui::SetNextItemWidth(120); // 设置输入框宽度
        ImGui::InputFloat("##speed_input", &speed, 0.1f, 1.0f, "%.2f"); // 输入框手动输入速度

        ImGui::Separator(); // 分隔线

        // 渲染质量参数
        ImGui::Text("渲染质量:");
        ImGui::SliderInt("##quality", &quality, 1, 10);
        ImGui::SameLine(0.0f, -1.0f);
        ImGui::SetNextItemWidth(120);
        ImGui::InputInt("##quality_input", &quality);

        ImGui::Separator();

        // 垂直同步参数
        ImGui::Text("垂直同步:");
        ImGui::SameLine(0.0f, -1.0f);
        ImGui::Checkbox("##vsync", &vsync);

        ImGui::Separator();

        // 物体颜色参数
        ImGui::Text("物体颜色:");
        ImGui::SameLine(0.0f, -1.0f);
        ImGui::ColorEdit3("##color", color, ImGuiColorEditFlags_NoInputs); // 颜色选择器

        ImGui::End(); // 结束窗口
    }

    void Toggle() { visible = !visible; } // 切换窗口显示/隐藏
};

// 主应用对象
SimpleParamWindow paramWindow;

// GLFW错误回调函数
void glfw_error_callback(int error, const char* description)
{
    fprintf(stderr, "GLFW Error %d: %s\n", error, description); // 打印GLFW错误信息
}

int main()
{
    // 初始化GLFW
    glfwSetErrorCallback(glfw_error_callback); // 设置错误回调
    if (!glfwInit()) // 初始化GLFW库
        return 1;

    // 创建窗口
    GLFWwindow* window = glfwCreateWindow(1280, 720, "ImGui参数调节示例", NULL, NULL); // 创建1280x720窗口
    if (window == NULL)
        return 1;
    glfwMakeContextCurrent(window); // 设置OpenGL上下文
    glfwSwapInterval(1); // 启用垂直同步

    // 初始化ImGui
    IMGUI_CHECKVERSION(); // 检查ImGui版本
    ImGui::CreateContext(); // 创建ImGui上下文
    ImGuiIO& io = ImGui::GetIO(); (void)io; // 获取IO对象
    ImFontConfig font_cfg;
    font_cfg.FontNo = 0; // 加载ttc字体的第一个字体
    io.Fonts->AddFontFromFileTTF("/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc", 20.0f, &font_cfg, io.Fonts->GetGlyphRangesChineseFull()); // 加载中文字体
    ImGui::StyleColorsDark(); // 设置暗色主题

    // 初始化平台/渲染后端
    ImGui_ImplGlfw_InitForOpenGL(window, true); // 初始化GLFW平台
    ImGui_ImplOpenGL3_Init("#version 130"); // 初始化OpenGL3渲染

    // 主循环
    while (!glfwWindowShouldClose(window))
    {
        glfwPollEvents(); // 处理窗口事件

        // 开始ImGui帧
        ImGui_ImplOpenGL3_NewFrame();
        ImGui_ImplGlfw_NewFrame();
        ImGui::NewFrame();

        // 显示主菜单栏
        if (ImGui::BeginMainMenuBar())
        {
            if (ImGui::BeginMenu("工具"))
            {
                if (ImGui::MenuItem("参数面板", "P"))
                    paramWindow.Toggle(); // 菜单项切换参数面板显示
                ImGui::EndMenu();
            }
            ImGui::EndMainMenuBar();
        }

        // 渲染参数窗口
        paramWindow.Render();

        // 渲染
        ImGui::Render(); // 生成绘制数据
        int display_w, display_h;
        glfwGetFramebufferSize(window, &display_w, &display_h); // 获取帧缓冲区大小
        glViewport(0, 0, display_w, display_h); // 设置OpenGL视口
        glClearColor(0.1f, 0.1f, 0.1f, 1.0f); // 设置背景色
        glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲
        ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); // 用ImGui数据渲染

        glfwSwapBuffers(window); // 交换前后缓冲区
    }

    // 清理
    ImGui_ImplOpenGL3_Shutdown(); // 关闭ImGui OpenGL3后端
    ImGui_ImplGlfw_Shutdown(); // 关闭ImGui GLFW后端
    ImGui::DestroyContext(); // 销毁ImGui上下文

    glfwDestroyWindow(window); // 销毁窗口
    glfwTerminate(); // 终止GLFW

    return 0; // 程序结束
}